Amazon VPCのサブネットマスクを確認するAWS Configカスタムルールを作成してみた
Amazon VPC における IPv4 アドレスのサブネットマスクの設定がルール化されている環境を想定して、サブネットマスクをチェックする AWS Config カスタムルールを作成してみました。VPC とサブネットのサブネットマスクをチェックします。
Guard を使用した Config カスタムルールの基本的な内容については次のブログが参考になります。
やってみた
Guard を使用した AWS Config カスタムルールで次の内容をチェックしてみます。あまりない状況かもしれませんが、気になったのでサブネットのチェックも試してみます。
- VPC
- IPv4 のサブネットマスクが
/16
であること - IPv6 の割り当てがないこと
- IPv4 のサブネットマスクが
- サブネット
- IPv4 のサブネットマスクが
/24
であること - IPv6 の割り当てがないこと
- IPv4 のサブネットマスクが
VPC のチェック
1 つの例として、次の Guard ルールでサブネットマスクをチェックできました。
let ipv4_cidr_block = configuration.cidrBlock let ipv4_cidr_block_association_set = configuration.cidrBlockAssociationSet[*] rule ipv4_cidr_block_check { %ipv4_cidr_block == /.*\/16$/ } rule ipv4_cidr_block_association_set_check { %ipv4_cidr_block_association_set.cidrBlock == /.*\/16$/ } rule ipv6_check { configuration.ipv6CidrBlockAssociationSet empty }
AWS Config の VPC に関する設定項目情報の例です。この例を基に説明します。
{ "version": "1.3", "accountId": "111122223333", "configurationItemCaptureTime": "2023-02-07T14:30:33.414Z", "configurationItemStatus": "ResourceDiscovered", "configurationStateId": "1675780233414", "configurationItemMD5Hash": "", "arn": "arn:aws:ec2:ap-northeast-1:111122223333:vpc/vpc-01f98cdd13fbd0bbb", "resourceType": "AWS::EC2::VPC", "resourceId": "vpc-01f98cdd13fbd0bbb", "awsRegion": "ap-northeast-1", "availabilityZone": "Multiple Availability Zones", "tags": { "Name": "test-vpc4" }, "relatedEvents": [], "relationships": [ { "resourceType": "AWS::EC2::RouteTable", "resourceId": "rtb-07c4b5ae9bf5d9cdf", "relationshipName": "Contains RouteTable" }, { "resourceType": "AWS::EC2::SecurityGroup", "resourceId": "sg-000d58bf3f5fc3602", "relationshipName": "Contains SecurityGroup" }, { "resourceType": "AWS::EC2::NetworkAcl", "resourceId": "acl-090e327c43c3cfe49", "relationshipName": "Contains NetworkAcl" } ], "configuration": { "cidrBlock": "10.0.0.0/16", "dhcpOptionsId": "dopt-0c4b38e700e8e3095", "state": "available", "vpcId": "vpc-01f98cdd13fbd0bbb", "ownerId": "111122223333", "instanceTenancy": "default", "ipv6CidrBlockAssociationSet": [ { "associationId": "vpc-cidr-assoc-071ed66290e11471e", "ipv6CidrBlock": "2001:db8:0:f100::/56", "ipv6CidrBlockState": { "state": "associated" }, "networkBorderGroup": "ap-northeast-1", "ipv6Pool": "Amazon" } ], "cidrBlockAssociationSet": [ { "associationId": "vpc-cidr-assoc-0c33b8c7fd51d76eb", "cidrBlock": "10.0.0.0/16", "cidrBlockState": { "state": "associated" } }, { "associationId": "vpc-cidr-assoc-0c4cc25b51d7e6245", "cidrBlock": "10.1.0.0/16", "cidrBlockState": { "state": "associated" } }, { "associationId": "vpc-cidr-assoc-04bd20dc158719d3e", "cidrBlock": "10.2.0.0/16", "cidrBlockState": { "state": "associated" } } ], "isDefault": false, "tags": [ { "key": "Name", "value": "test-vpc4" } ] }, "supplementaryConfiguration": {}, "resourceTransitionStatus": "None" }
上記の例では次の CIDR が含まれています。
- VPC 作成時に指定した CIDR
10.0.0.0/16
- 追加の IPv4 CIDR
10.1.0.0/16
10.2.0.0/16
- 追加の IPv6 CIDR
2001:db8:0:f100::/56
VPC 作成時に設定した IPv4 アドレスの CIDR はcidrBlock
とcidrBlockAssociationSet
の両方で記録されるようです。そのため、今回のサンプルコードでは両方をチェックしていますが、cidrBlockAssociationSet
のチェックだけでも問題ないかもしれません。
また、IPv6 アドレスの CDIR が設定されている場合はipv6CidrBlockAssociationSet
に記録されるようなので、今回のサンプルコードではipv6CidrBlockAssociationSet
が empty (未設定) であることを確認しています。
AWS Config ルールを設定する際は、対象のリソースとしてAWS EC2 VPC
を選択します。
テスト用 VPC を評価した結果です。
No. | cidrBlock | cidrBlockAssociationSet | ipv6CidrBlockAssociationSet | 結果 |
---|---|---|---|---|
1 | 10.0.0.0/16 | 10.0.0.0/16 | - | 準拠 |
2 | 10.0.0.0/16 | 10.0.0.0/16 | 2001:db8:0:f100::/56 | 非準拠 |
3 | 10.0.0.0/16 | 10.0.0.0/16, 10.1.0.0/16, 10.2.0.0/16 | - | 準拠 |
4 | 10.0.0.0/16 | 10.0.0.0/16, 10.1.0.0/16, 10.2.0.0/16 | 2001:db8:0:f100::/56 | 非準拠 |
5 | 10.0.0.0/24 | 10.0.0.0/24 | - | 非準拠 |
サブネットのチェック
1 つの例として、次の Guard ルールでサブネットマスクをチェックできました。
let ipv4_cidr_block = configuration.cidrBlock rule ipv4_cidr_block_check { %ipv4_cidr_block == /.*\/24$/ } rule ipv6_check { configuration.ipv6CidrBlockAssociationSet empty }
AWS Config のサブネットに関する設定項目情報の例です。この例を基に説明します。
{ "version": "1.3", "accountId": "111122223333", "configurationItemCaptureTime": "2023-02-07T14:56:28.127Z", "configurationItemStatus": "OK", "configurationStateId": "1675781788127", "configurationItemMD5Hash": "", "arn": "arn:aws:ec2:ap-northeast-1:111122223333:subnet/subnet-096eb9fc90a4be53a", "resourceType": "AWS::EC2::Subnet", "resourceId": "subnet-096eb9fc90a4be53a", "awsRegion": "ap-northeast-1", "availabilityZone": "ap-northeast-1a", "tags": { "Name": "public-subnet" }, "relatedEvents": [], "relationships": [ { "resourceType": "AWS::EC2::VPC", "resourceId": "vpc-0aff88524d091194e", "relationshipName": "Is contained in Vpc" } ], "configuration": { "availabilityZone": "ap-northeast-1a", "availabilityZoneId": "apne1-az4", "availableIpAddressCount": 251, "cidrBlock": "10.0.0.0/24", "defaultForAz": false, "mapPublicIpOnLaunch": false, "mapCustomerOwnedIpOnLaunch": false, "state": "available", "subnetId": "subnet-096eb9fc90a4be53a", "vpcId": "vpc-0aff88524d091194e", "ownerId": "111122223333", "assignIpv6AddressOnCreation": false, "ipv6CidrBlockAssociationSet": [ { "associationId": "subnet-cidr-assoc-099d7690accbb72f1", "ipv6CidrBlock": "2001:db8:0:f100::/64", "ipv6CidrBlockState": { "state": "associated" } } ], "tags": [ { "key": "Name", "value": "public-subnet" } ], "subnetArn": "arn:aws:ec2:ap-northeast-1:111122223333:subnet/subnet-096eb9fc90a4be53a" }, "supplementaryConfiguration": {}, "resourceTransitionStatus": "None" }
上記の例では次の CIDR が含まれています
- IPv4 CIDR
10.0.0.0/24
- IPv6 CIDR
2001:db8:0:f100::/64
サブネットの IPv4 アドレスの CIDR が記録されているcidrBlock
をチェックしています。VPC とは異なり、IPv4 アドレスの CIDR は 1 つのみの設定となり、IPv6 アドレスの CIDR のみを設定することも可能です。
また、IPv6 アドレスの CDIR が設定されている場合はipv6CidrBlockAssociationSet
に記録されるようなので、今回のサンプルコードでは VPC 同様にipv6CidrBlockAssociationSet
が empty であることを確認しています。
AWS Config ルールを設定する際は、対象のリソースとしてAWS EC2 Subnet
を選択します。
テスト用サブネットを評価した結果です。
No | cidrBlock | ipv6CidrBlockAssociationSet | 結果 |
---|---|---|---|
1 | 10.0.0.0/24 | - | 準拠 |
2 | 10.0.0.0/24 | 2001:db8:0:f100::/64 | 非準拠 |
3 | 10.0.128.0/17 | - | 非準拠 |
4 | - | 2001:db8:0:f101::/64 | 非準拠 |
おわりに
Amazon VPC における IPv4 アドレスのサブネットマスクの設定がルール化されている環境を想定して、サブネットマスクをチェックする AWS Config カスタムルールを作成してみました。
このブログがどなたかのご参考になれば幸いです。